﻿#pragma once

#include <windows.h>	//WINAPI相关操作，srand,sleep,system等
#include<stdio.h>		//标准输入输出(print,scanf,perror等)
#include<assert.h>		//assert()等
#include <locale.h>		//本地环境设置,主要是为了宽字符的打印
#include <stdbool.h>	//true,false



#define KEY_PRESS(vk)  ((GetAsyncKeyState(vk)&1)?1:0)//用来判断按键是否被按

#define WALL L'□'	//墙
#define BLOCK L'■' //块
#define TIME 1000	//睡眠时间

typedef struct BlockCoordinate
{
	int x;//确定一个中心(x,y)
	int y;
	int a;
	//然后由中心旋转，确定俄罗斯方块此时的状态
}BC;

typedef struct System
{
	BC a[250];//200个格子
	BC b[7][4];//7种俄罗斯方块，每种都是有4个块
	int type;//俄罗斯方块种类
}Ss;

enum GAME_STATUS	//枚举
{
	OK,				//正常
	KILL_BY_SELF,	//正常失败
	END_NORMAL		//正常退出
};

enum GAME_OPERATE
{
	RENEW,	//重新生成俄罗斯方块
	CLEAR,	//清除并得分
	NORMAL	//正常状态
};

typedef struct Tetris
{
	Ss s;						//格子状态over(1)和out(0)
	enum GAME_STATUS _Status;	//游戏状态
	enum GAME_OPERATE _Operate;	//操作状态
	enum DIRECTION _Dir;		//俄罗斯方块的方向
	int _Socre;					//游戏分数
	int _SleepTime;				//休眠时间
	int _Row;					//要清除的行
}Tetris, * pTetris;


//暂停
void Pause();

//游戏初始化
void GameInit(pTetris t);

//设置光标位置
void SetPos(short x, short y);

//打印欢迎界⾯
void WelcomeToGame();

//创建地图
void CreateMap();

//初始俄罗斯方块位置
void BlockInit(pTetris t);

//将over的块打印出来
void OverPrint(pTetris t);//over为1，out为0

//先初始化over的块
void OverInit(pTetris t);

//游戏运行
void GameRun(pTetris t);

//初始俄罗斯方块信息
void TetrisInit(pTetris t);

//转化，消除俄罗斯方块
void BlockTurn(pTetris t);
void FBlockTurn(pTetris t);

//俄罗斯方块移动
void BlockMove(pTetris t);

//俄罗斯方块左旋转,右旋转
void BlockLeftSpin(pTetris t);
void BlockRightSpin(pTetris t);

//左移右移
void RightMove(pTetris t);
void LeftMove(pTetris t);

//下移上移
void DownMove(pTetris t);
void UpMove(pTetris t);

//独家秘方
bool ax1(pTetris t);
bool ax2(pTetris t);
bool ax3(pTetris t);
bool ax33(pTetris t);
bool ax4(pTetris t);

//方块清除
void BlockClear(pTetris t);

//所有格子下移一位，消除最后一行用
void BlockClearRow(pTetris t);

//检测是否失败
void TetrisCheck(pTetris t);

//游戏退出时的维护
void GameEnd(pTetris t);
